import { Injectable } from '@nestjs/common'
import { Dayjs } from 'dayjs'
import * as fsAsync from 'fs/promises'
import * as path from 'path'

type LocalFileDataQueryOptions = {
    deviceNumber: string
    date: Dayjs
    basePath: string
}

@Injectable()
export class LocalFileCollectionService {
    constructor() {}

    /**
     * 读取文件数据
     * @param options 查询选项，包含设备号和日期
     */
    async readData(options: LocalFileDataQueryOptions): Promise<string[]> {
        const { deviceNumber, date, basePath } = options

        // 为设备号补齐0
        const deviceNumberWithZero = deviceNumber.startsWith('0') ? deviceNumber : `0${deviceNumber}`

        // 根据配置的基础路径和查询参数构建完整文件路径
        // 路径格式: ${basePath}/${第几周}/${日期}/${设备尾号2位}/0${设备号}.log
        const week = date.week()
        const filePath = path.join(basePath, `${week}/${date.format('YYYY-MM-DD')}/${deviceNumber.slice(-2)}/${deviceNumberWithZero}.log`)

        // 判断文件是否存在
        try {
            await fsAsync.access(filePath)
        } catch {
            // 文件不存在，返回空数组
            return []
        }

        // 读取文件内容
        const data = await fsAsync.readFile(filePath, 'utf8')

        // 去除UTF-8 BOM字符（如果存在）
        const cleanData = data.replace(/^\uFEFF/, '')

        // 格式化数据
        const lines = cleanData.split('\n')

        const result: string[] = []

        for (let i = 0; i < lines.length; i++) {
            const line = lines[i]

            // 快速检查空行和最小长度
            if (!line || line.length < 20) {
                continue
            }

            // 查找第一个空格位置来分离时间
            const spaceIndex = line.indexOf(' ')

            // 验证基本格式
            if (spaceIndex === -1 || spaceIndex > 25) {
                continue
            }

            // 时间验证
            const timeStr = line.substring(0, spaceIndex)

            // 快速验证时间格式 - 计数点的数量
            let dotCount = 0
            for (let n = 0; n < timeStr.length; n++) {
                if (timeStr[n] === '.') {
                    dotCount++
                }
            }

            if (dotCount !== 2) {
                continue
            }

            // 通过时间检查，添加到结果
            result.push(line)
        }

        return result
    }
}
